#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
 
//预防发生错误
//通过编码的技巧，减少错误
//模拟实现strcpy
//strcpy-字符串拷贝

//写得不好
//void my_strcpy(char *dest,char *src)
//{
//	while (* src != '\0') //起到了停止作用，但“\0”没有拷贝过去
//	{
//		*dest = *src; //指针地址的解引用  对hello的拷贝
//		dest++;
//		src++;
//	}
//	*dest = *src;  //重复赋值 将“\0”拷贝过去
//}

//改进一：
//void my_strcpy(char* dest, char* src)
//{
//	while (*src != '\0')
//	{
//		*dest ++ = *src++; //后置加加：先引用 ，在加加
//		
//	}
//	*dest = *src;
//}

/*
//改进二：
 void my_strcpy(char* dest, char* src)
{
	while (*dest++ = *src++) // 字母的0ASCII码都不为0就一直循环
		             //斜杠0ASCII值为0，正好可­以作为判断条件
		//就达到了  既拷贝\0 又停下来了
	{
		;   //空语句
		
	}
}
*/

//改进三：
//把 src指向的内容拷贝放进dest指向的空间中
//从本质上讲，希望dest指向的内容被修改，src指向的内容不应该被修改
void my_strcpy(char* dest, const char* src) //const 修饰变量，这个变量就被称为常变量（不能被修改，但是本质上还是变量） 
 {
	//空指针不能进行解应用操作
	 assert(dest != NULL);
	 assert(src != NULL); //断言 (代码有问题报错后，有提示信息)
	 while (*dest++ = *src++) 
	 {
		 ;   //Hello的拷贝

	 }
 }


int main() { 
	char arr1[20] = "XXXXXXXXXXXX";
	char arr2[] = "Hello";

	my_strcpy(arr1,arr2);
	//strcpy(arr1,arr2);     //1，自标空间的起始地址，2。源空间的起始地址
	printf("%s\n", arr1);
	return 0;
} 
 


/*
 //改进四：（标准的进行库函数的一个模拟实现）
//strcpy 这个库函数 其实返回的是目标空间的起始地址

char * my_strcpy(char* dest, const char* src) //const 修饰变量，这个变量就被称为常变量（不能被修改，但是本质上还是变量） 
{
	assert(dest != NULL);
	assert(src != NULL); //断言 (代码有问题报错后，有提示信息)
	char * ret = dest;
	while (*dest++ = *src++)
	{
		;   //Hello的拷贝

	}
	return ret;//返回目标空间的起始地址
}
int main() {
	char arr1[20] = "XXXXXXXXXXXX";
	char arr2[] = "Hello";

	
	//strcpy(arr1,arr2);     //1.自标空间的起始地址，2。源空间的起始地址
	printf("%s\n", my_strcpy(arr1, arr2)); //链式访问（一个函数的返回值作为另一个函数的参数）
	return 0;
}
*/